package com.gosophia.metadataEngine.ws;

import java.util.List;

import java.util.Map;

import javax.jws.WebService;
import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;

import com.gosophia.commons.OrderCondition;
import com.gosophia.commons.Page;
import com.gosophia.commons.PropertyFilter;
import com.gosophia.commons.exception.BusinessException;
import com.gosophia.commons.exception.CommonException;
import com.gosophia.commons.exception.ConcurrencyException;
import com.gosophia.commons.exception.ParameterException;
import com.gosophia.commons.exception.TechnicalException;
import com.gosophia.metadataEngine.dto.DataSourceInfoDto;
import com.gosophia.metadataEngine.dto.MetaDataFieldDto;
import com.gosophia.metadataEngine.dto.MetaDataTableDto;
import com.gosophia.metadataEngine.util.MetadataEngineMapAdapter;
import com.gosophia.metadataEngine.util.MetadataEngineMapPageAdapter;

/**
 * 元数据--MetadataWebService接口
 * 
 * @author tianchunyu
 * @date 2010-9-16
 */
public interface MetadataEngineWebService {

	/**
     * 根据系统数据编号，查询该系统数据的详细页面显示信息
     * @param id:要查询的数据在接入的系统表中的id
     * @param metaDataTableId：系统表对应的元数据id
     * @return：Map<String,Object>
     */
    public Map<String,Object> findSystemDataDetail(Long id,Long metaDataTableId);
	
	/**
     * 分页模糊搜索，查询指定委办局系统表的数据
     * @param metaDataTableId metaDataTableId:指定系统在元数据表中id
     * @param page不能为null page.pageSize>0,page.pageNo>0
     * @param searchString 查询条件
     * @param orderConditions 排序字段列表
     * @parma propertyFilters 
     * @since 2011-4-29
     * @author wangxinbing
     * @return
     */
    public Page<Map<String, Object>> findSystemDataSimpleByPage(Long metaDataTableId,
    		             Page<Map<String, Object>> page,String searchString,List<OrderCondition> orderConditions,List<PropertyFilter> propertyFilters);
    
    /**
     * 分页模糊搜索，查询指定委办局系统表的数据
     * @param metaDataTableId metaDataTableId:指定系统在元数据表中id
     * @param propertyFilters 查询条件列表
     * @param page不能为null page.pageSize>0,page.pageNo>0
     * @param orderConditions 排序字段列表
     * @since 2011-4-29
     * @author wangxinbing
     * @return
     */
    public Page<Map<String, Object>> findSystemDataAdvanceByPage(Long metaDataTableId,
    		List<PropertyFilter> propertyFilters,Page<Map<String, Object>> page,List<OrderCondition> orderConditions);

    /**
     * 添加数据源信息: dataSourceInfoDto不能为null,name不能为null,
     * driverClass不能为null,dialect不能为null,
     * password不能为null,userName不能为null,url不能为null
     * 
     * @param dataSourceInfoDto
     *            不能为null,dataSourceInfoId必须为null
     * @throws BusinessException,CommonException
     *             当添加失败时
     */
    public void addDataSourceInfo(DataSourceInfoDto dataSourceInfoDto)
            throws BusinessException,ParameterException,ConcurrencyException,TechnicalException;

    /**
     * 删除数据源信息:
     * 
     * @param id
     * @param version
     * @return 被删除的数据源
     * @throws BusinessException,ParameterException,ConcurrencyException,TechnicalException
     *         当删除失败时
     */
    public DataSourceInfoDto removeDataSourceInfo(Long id, Long version)
            throws BusinessException,ParameterException,ConcurrencyException,TechnicalException;

    /**
     * 修改数据源信息
     * 
     * @param dataSourceInfoDto
     *            不能为null，dataSourceInfoDtoId不能为null
     * @throws BusinessException,ParameterException,ConcurrencyException,TechnicalException
     *             更新失败时
     */
    public void updateDataSourceInfo(DataSourceInfoDto dataSourceInfoDto)
            throws BusinessException,ParameterException,ConcurrencyException,TechnicalException;

    /**
     * 分页模糊查询所有数据源信息
     * 
     * @param pageSize
     *            分页条件pageSize 必须为正整数
     * @param pageNo
     *            分页条件 pageNo 必须为正整数
     * @param searchString 模糊查询条件
     * @param orderConditions 排序条件
     * @return 
     * @throws ParameterException,ConcurrencyException,TechnicalException
     *             系统运行错误时
     */
    public Page<DataSourceInfoDto> findAllDataSourceInfoByPage(int pageSize,
            int pageNo, String searchString, List<OrderCondition> orderConditions) throws ParameterException,ConcurrencyException,TechnicalException;

    /**
     * 根据dataSrouceInfoId查询数据源信息
     * 
     * @param dataSourceInfoId
     *            不能为null
     * @return 根据dataSrouceInfoId查询数据源
     * @throws ParameterException,ConcurrencyException,TechnicalException
     *             系统运行错误时
     */
    public DataSourceInfoDto findDataSourceInfoById(Long dataSourceInfoId)
            throws ParameterException,ConcurrencyException,TechnicalException;

    // ////////////////////////////////////////////////////////////////////////

    /**
     * 将对接表的字段描述添加到字段表中
     * 
     * @param metaDataFieldDtos
     *            不能为null
     * @throws BusinessException,ParameterException,ConcurrencyException,TechnicalException
     *             :当同一个元数据表id下名称，中文名称或属性名称重复时
     */
    public void addMetaDataField(List<MetaDataFieldDto> metaDataFieldDtos)
            throws BusinessException,ParameterException,ConcurrencyException,TechnicalException;

    /**
     * 修改
     * 
     * @param metaDataFieldDto不能为null
     *            ，metaDataFieldDto.id不能为null
     * @throws BusinessException,ParameterException,ConcurrencyException,TechnicalException
     *             修改失败时
     */
    public void updateMetaDataField(MetaDataFieldDto metaDataFieldDto)
            throws BusinessException,ParameterException,ConcurrencyException,TechnicalException;

    /**
     * 根据元数据中系统表id查询该系统表下所有字段（根据配置到元数据表中的id查询接入到系统中的表的字段信息）
     * 
     * @param tableId
     *            系统表id 不能为null
     * @return 系统表下所有字段
     * @throws BusinessException 
     * @throws BusinessException 
     * @throws BusinessException,ParameterException,ConcurrencyException,TechnicalException
     *             系统运行错误时
     */
    public List<MetaDataFieldDto> findSystemFieldByTableId(Long tableId)
            throws ParameterException,ConcurrencyException,TechnicalException,BusinessException;

    /**
     * 根据元数据中元数据表id查询该表所有的元数据字段（查询元数据字段表）
     * 
     * @param tableId
     *            元数据系统表编号 不能为null
     * @return 根据元数据中元数据表id查询该表所有的元数据字段
     * @throws ParameterException,ConcurrencyException,TechnicalException
     *             系统运行错误时
     */
    public List<MetaDataFieldDto> findMetaDataFieldByTableId(Long tableId)
            throws ParameterException,ConcurrencyException,TechnicalException;

    /**
     * 显示指定系统下列表页面应显示的字段（包括hidden字段）
     * 
     * @param tableId
     *            不能为null
     * @return 元数据字段列表
     * @throws ParameterException,ConcurrencyException,TechnicalException
     *             系统运行错误时
     */
    public List<MetaDataFieldDto> findMetaDataFieldByTableIdListShow(
            Long tableId) throws ParameterException,ConcurrencyException,TechnicalException;

    /**
     * 显示指定系统下详细页面应显示的字段（包括hidden字段）
     * 
     * @param tableId
     *            不能为null
     * @return 显示指定系统下详细页面应显示的字段
     * @throws ParameterException,ConcurrencyException,TechnicalException
     *             系统运行错误时
     */
    public List<MetaDataFieldDto> findMetaDataFieldByTableIdDetailShow(
            Long tableId) throws ParameterException,ConcurrencyException,TechnicalException;

    /**
     * 删除指定metaDataField
     * 
     * @param metaDataFieldId
     *            不能为null
     * @param version
     *            不能为null
     * @throws ParameterException,ConcurrencyException,TechnicalException
     *             系统运行错误时
     */
    @Deprecated
    public void removeMetaDataField(Long metaDataFieldId, Long version)
            throws ParameterException,ConcurrencyException,TechnicalException;


    /**
     * 添加元数据表信息: metaDataTableDto,tableName,tableNameCN,entityClassName不能为null，
     * metaDataTableId必须为null, dataSourceInfoId不能为null
     * 
     * @param metaDataTableDto
     *            元数据表 不能为null，metaDataTableDto.id必须为null
     * @throws BusinessException,ParameterException,ConcurrencyException,TechnicalException
     *             添加失败时
     */
    public void addMetaDataTable(MetaDataTableDto metaDataTableDto)
            throws BusinessException,ParameterException,ConcurrencyException,TechnicalException;

    /**
     * 修改元数据表信息: metaDataTableDto,tableName,tableNameCN,entityClassName不能为null
     * 
     * @param metaDataTableDto
     *            不能为null，metaDataTableDto.id不能为null
     * @throws BusinessException,ParameterException,ConcurrencyException,TechnicalException
     *             更新失败时
     */
    public void updateMetaDataTable(MetaDataTableDto metaDataTableDto)
            throws BusinessException,ParameterException,ConcurrencyException,TechnicalException;

    /**
     * 删除元数据表信息: metaDataTableId,version 不能为null
     * 
     * @param metaDataTableId
     * @param version
     * @throws BusinessException,ParameterException,ConcurrencyException,TechnicalException
     *             删除失败时
     * @return 返回删除的元数据表信息
     */
    public MetaDataTableDto removeMetaDataTable(Long metaDataTableId, Long version)
            throws BusinessException,ParameterException,ConcurrencyException,TechnicalException;

    /**
     * 根据元数据表id查询
     * 
     * @param metaDataTableId
     *            metaDataTableId不能为null
     * @return 元数据表对象
     * @throws ParameterException,ConcurrencyException,TechnicalException
     *             系统运行错误时
     */
    public MetaDataTableDto findMetaDataTableById(Long metaDataTableId)
            throws ParameterException,ConcurrencyException,TechnicalException;

    /**
     * 分页查询所有元数据表中记录
     * 
     * @param pageSize
     *            分页条件pageSize 必须为正整数
     * @param pageNo
     *            分页条件 pageNo 必须为正整数
     * @return 分页查询的所有元数据表中记录
     * @throws ParameterException,ConcurrencyException,TechnicalException
     *             系统运行错误时
     */
    @Deprecated
    public Page<MetaDataTableDto> findAllMetaDataTableByPage(int pageSize, int pageNo)
            throws ParameterException,ConcurrencyException,TechnicalException;
    /**
     * 手动初始化sessionFactories
     */
	public void initMetadataSessionFactories();
    /**
     * 根据数据源实体ID分页查询所拥有的元数据表
     * @param dataSourceInfoId 数据源实体ID 不能为null
     * @param page page.pageSize>0 page.pageNo>0
     * @param searchString 模糊查询条件
     * @param orderConditions 排序条件
     * @return
     */
	public Page<MetaDataTableDto> findMetadataTablePageByDataSourceInfoId(
			Long dataSourceInfoId, Page<MetaDataTableDto> page,
			String searchString, List<OrderCondition> orderConditions);
    /**
     * 检查填写的数据源是否正确
     * @param dataSourceInfoDto
     * @return 成功返回true 失败返回false;
     */
	public boolean checkDataSourceInfo(DataSourceInfoDto dataSourceInfoDto);
    /**
     * 查询显示列表项
     * @param metaDataTableId
     * @return
     */
	public List<MetaDataFieldDto> findShowTitleItemsByTableId(
			Long metaDataTableId);
    /**
     * 获取主键属性名称
     * @param metaDataTableId 不能为null
     * @return
     */
	public String findPrimaryKeyName(Long metaDataTableId);
    /**
     * 查询出详细页面显示项
     * @param metaDataTableId 不能为null
     * @return
     */
	public List<MetaDataFieldDto> findDetailShowItemsByTableId(
			Long metaDataTableId);
    /**
     * 查询指定字段的引用值
     * @param metaDataTableId
     * @param metaDataFieldId
     * @return
     */
	public List<List<Object>> findRefValues(Long metaDataTableId, Long metaDataFieldId) throws BusinessException;
	/**
	 * 根据fieldId查询元数据属性实体
	 * @param metaDataFieldId 不能为null
	 * @return
	 */
	public MetaDataFieldDto findMetaDataFieldByDataFieldId(Long metaDataFieldId);
    /**
     * 更新元数据表属性
     * @param metaDataTableId
     * @param metaDataFieldDtos
     */
	public void updateMetaDataFields(Long metaDataTableId,
			List<MetaDataFieldDto> metaDataFieldDtos) throws BusinessException;
	/**
	 * 根据主键ID删除该条业务数据
	 * @param dataId 业务数据ID
	 * @param metaDataTableId 对应的元数据表ID
	 * @throws BusinessException 
	 * @since 2011-6-10
	 * @author wangxinbing
	 */
	public void deleteSystemDataById(Long dataId,Long metaDataTableId) throws BusinessException;
	/**
	 * 更新指定业务数据
	 * @param dataId
	 * @param metaDataTableId
	 * @param values key是实体属性名，value是对应的值
	 * @throws BusinessException
	 * @since 2011-6-10
	 * @author wangxinbing
	 */
	public void updateSystemData(Long dataId,Long metaDataTableId,Map<String ,Object> values) throws BusinessException;
	/**
	 * 添加业务数据
	 * @param metaDataTableId 元数据表id,不能为null
	 * @param values 
	 * @throws BusinessException
	 * @since 2011-6-10
	 * @author wangxinbing
	 */
	public void addSystemData(Long metaDataTableId,Map<String ,Object> values) throws BusinessException;
}

// /:~